package com.zxn.ssyx.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxn.ssyx.common.exception.SsyxException;
import com.zxn.ssyx.common.result.ResultCodeEnum;
import com.zxn.ssyx.mapper.SkuInfoMapper;
import com.zxn.ssyx.model.product.SkuAttrValue;
import com.zxn.ssyx.model.product.SkuImage;
import com.zxn.ssyx.model.product.SkuInfo;
import com.zxn.ssyx.model.product.SkuPoster;
import com.zxn.ssyx.service.SkuAttrValueService;
import com.zxn.ssyx.service.SkuImageService;
import com.zxn.ssyx.service.SkuInfoService;
import com.zxn.ssyx.service.SkuPosterService;
import com.zxn.ssyx.vo.product.SkuInfoQueryVo;
import com.zxn.ssyx.vo.product.SkuInfoVo;
import jodd.util.CollectionUtil;
import org.bouncycastle.pqc.jcajce.provider.qtesla.SignatureSpi;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoMapper, SkuInfo> implements SkuInfoService {
    @Autowired
    private SkuInfoMapper skuInfoMapper;

    @Autowired
    private SkuPosterService skuPosterService;

    @Autowired
    private SkuImageService skuImageService;

    @Autowired
    private SkuAttrValueService skuAttrValueService;

    @Override
    public IPage<SkuInfo> selectPage(Page<SkuInfo> pageParam, SkuInfoQueryVo skuInfoQueryVo) {
        LambdaQueryWrapper<SkuInfo> lqw = new LambdaQueryWrapper<>();
        Long categoryId = skuInfoQueryVo.getCategoryId();
        String skuType = skuInfoQueryVo.getSkuType();
        String keyword = skuInfoQueryVo.getKeyword();
        if (categoryId != null) {
            lqw.eq(SkuInfo::getCategoryId, categoryId);
        }
        if (skuType != null) {
            lqw.eq(SkuInfo::getSkuType, skuType);
        }
        if (keyword != null) {
            lqw.like(SkuInfo::getSkuName, keyword);
        }
        return skuInfoMapper.selectPage(pageParam, lqw);
    }

    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void saveSkuInfo(SkuInfoVo skuInfoVo) {
        SkuInfo skuInfo = new SkuInfo();
        BeanUtils.copyProperties(skuInfoVo, skuInfo);
        save(skuInfo);
        Long id = skuInfo.getId();
        saveAllList(skuInfoVo, id);
    }

    private void saveAllList(SkuInfoVo skuInfoVo, Long id) {
        // 保存海报列表
        List<SkuPoster> skuPosterList = skuInfoVo.getSkuPosterList();
        if (!CollectionUtils.isEmpty(skuPosterList)) {
            List<SkuPoster> posterList = skuPosterList.stream().peek(skuPoster -> skuPoster.setSkuId(id)).collect(Collectors.toList());
            skuPosterService.saveBatch(posterList);
        }

        //保存sku图片
        List<SkuImage> skuImagesList = skuInfoVo.getSkuImagesList();
        if (!CollectionUtils.isEmpty(skuImagesList)) {
            int sort = 1;
            for (SkuImage skuImages : skuImagesList) {
                skuImages.setSkuId(id);
                skuImages.setSort(sort);
                sort++;
            }
            skuImageService.saveBatch(skuImagesList);
        }

        //保存sku平台属性
        List<SkuAttrValue> skuAttrValueList = skuInfoVo.getSkuAttrValueList();
        if (!CollectionUtils.isEmpty(skuAttrValueList)) {
            int sort = 1;
            for (SkuAttrValue skuAttrValue : skuAttrValueList) {
                skuAttrValue.setSkuId(id);
                skuAttrValue.setSort(sort);
                sort++;
            }
            skuAttrValueService.saveBatch(skuAttrValueList);
        }
    }

    @Override
    public SkuInfoVo getSkuInfoVo(Long id) {
        SkuInfo skuInfo = skuInfoMapper.selectById(id);
        if (ObjectUtil.isNull(skuInfo)) {
            throw new SsyxException(ResultCodeEnum.SKUINFO_IS_NULL);
        }
        List<SkuPoster> posterList = skuPosterService.selectBySkuId(skuInfo.getId());
        List<SkuImage> imageList = skuImageService.selectBySkuId(skuInfo.getId());
        List<SkuAttrValue> skuAttrValueList = skuAttrValueService.selectBySkuId(skuInfo.getId());
        SkuInfoVo skuInfoVo = new SkuInfoVo();
        BeanUtils.copyProperties(skuInfo, skuInfoVo);
        skuInfoVo.setSkuPosterList(posterList);
        skuInfoVo.setSkuImagesList(imageList);
        skuInfoVo.setSkuAttrValueList(skuAttrValueList);
        return skuInfoVo;
    }

    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void updateSkuInfo(SkuInfoVo skuInfoVo) {
        Long id = skuInfoVo.getId();
        updateById(skuInfoVo);
        skuPosterService.remove(new LambdaQueryWrapper<SkuPoster>().eq(SkuPoster::getSkuId, id));
        skuImageService.remove(new LambdaQueryWrapper<SkuImage>().eq(SkuImage::getSkuId, id));
        skuAttrValueService.remove(new LambdaQueryWrapper<SkuAttrValue>().eq(SkuAttrValue::getSkuId, id));
        saveAllList(skuInfoVo, id);
    }

    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void publish(Long skuId, Integer status) {
        SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
        if (ObjectUtil.isNull(skuInfo)) {
            throw new SsyxException(ResultCodeEnum.SKUINFO_IS_NULL);
        }
        skuInfo.setPublishStatus(status);
        updateById(skuInfo);
        //TODO 商品上下架 后续会完善：发送mq消息更新es数据
    }

    @Override
    @Transactional(rollbackFor = {Exception.class})
    public void isNewPerson(Long skuId, Integer status) {
        SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
        if (ObjectUtil.isNull(skuInfo)) {
            throw new SsyxException(ResultCodeEnum.SKUINFO_IS_NULL);
        }
        skuInfo.setIsNewPerson(status);
        updateById(skuInfo);
    }

    @Override
    public void check(Long skuId, Integer status) {
        SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
        if (ObjectUtil.isNull(skuInfo)) {
            throw new SsyxException(ResultCodeEnum.SKUINFO_IS_NULL);
        }
        skuInfo.setCheckStatus(status);
        updateById(skuInfo);
    }


}
